home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Mission 3
/
Mission 3.zip
/
Mission 3.iso
/
zugabe
/
va45
/
visual45
/
objects
/
form
/
slider.s
< prev
next >
Wrap
Text File
|
1998-09-06
|
17KB
|
566 lines
DATA
GWVA_FSLIDER_DEFAULT_METHODLIST:
GWVA_OBJ_STRUCT_METHOD GWVA_METHOD_CREATE,GWVA_FSLIDER_PRG_CREATE
GWVA_OBJ_STRUCT_METHOD GWVA_METHOD_FORM_CLICK,GWVA_FSLIDER_PRG_CLICK
GWVA_OBJ_STRUCT_METHOD GWVA_METHOD_FSLIDER_PLUS1,GWVA_FSLIDER_PRG_PLUS1
GWVA_OBJ_STRUCT_METHOD GWVA_METHOD_FSLIDER_MINUS1,GWVA_FSLIDER_PRG_MINUS1
GWVA_OBJ_STRUCT_METHOD GWVA_METHOD_FSLIDER_PLUSPAGE,GWVA_FSLIDER_PRG_PLUSPAGE
GWVA_OBJ_STRUCT_METHOD GWVA_METHOD_FSLIDER_MINUSPAGE,GWVA_FSLIDER_PRG_MINUSPAGE
GWVA_OBJ_STRUCT_METHOD GWVA_METHOD_FSLIDER_SET_POSITION,GWVA_FSLIDER_PRG_SET_POSITION
GWVA_OBJ_STRUCT_METHOD GWVA_METHOD_FSLIDER_MOVE,GWVA_FSLIDER_PRG_MOVE
GWVA_OBJ_STRUCT_METHOD_END_LIST
TEXT
;------------------------------------------------------------------------------
; Method name : GWVA_METHOD_FSLIDER_PLUS1
; Asm label : GWVA_FSLIDER_PRG_PLUS1
; Description : Déplace le slider d'un élément en plus
;
; Rq : Génère un FSLIDER_MOVE et eventuellement un MOVED.
; Rq : Pas de gestion de l'objet RSC de P1.
;
; in : a0.l = pointeur sur l'objet
; in : a1.l = pointeur sur la fenêtre formulaire
; out : d6.w = GWVA_PRGRET_CONSUMED
;
; 01/05/98 : Création
;------------------------------------------------------------------------------
GWVA_FSLIDER_PRG_PLUS1:
; pas de before
;-----------------------------------;
move.l #1,d0 ; déplacement sur d0.l
GWVA_CALL_METHOD_DIFF_METH_SAME_CLASS #GWVA_METHOD_FSLIDER_MOVE
;-----------------------------------;
; pas d'after
move.w #GWVA_PRGRET_CONSUMED,d6
rts
;------------------------------------------------------------------------------
; Method name : GWVA_METHOD_FSLIDER_MINUS1
; Asm label : GWVA_FSLIDER_PRG_MINUS1
; Description : Déplace le slider d'un élément en moins
;
; Rq : Génère un FSLIDER_MOVE et eventuellement un MOVED.
; Rq : Pas de gestion de l'objet RSC de M1.
;
; in : a0.l = pointeur sur l'objet
; in : a1.l = pointeur sur la fenêtre formulaire
; out : d6.w = GWVA_PRGRET_CONSUMED
;
; 01/05/98 : Création
;------------------------------------------------------------------------------
GWVA_FSLIDER_PRG_MINUS1:
; pas de before
;-----------------------------------;
move.l #-1,d0 ; déplacement sur d0.l
GWVA_CALL_METHOD_DIFF_METH_SAME_CLASS #GWVA_METHOD_FSLIDER_MOVE
;-----------------------------------;
; pas d'after
move.w #GWVA_PRGRET_CONSUMED,d6
rts
;------------------------------------------------------------------------------
; Method name : GWVA_METHOD_FSLIDER_PLUSPAGE
; Asm label : GWVA_FSLIDER_PRG_PLUSPAGE
; Description : Déplace le slider d'une page en plus
;
; Rq : Génère un FSLIDER_MOVE et eventuellement un MOVED.
; Rq : Pas de gestion de l'objet RSC de P1P.
;
; in : a0.l = pointeur sur l'objet
; in : a1.l = pointeur sur la fenêtre formulaire
; out : d6.w = GWVA_PRGRET_CONSUMED
;
; 01/05/98 : Création
;------------------------------------------------------------------------------
GWVA_FSLIDER_PRG_PLUSPAGE:
; pas de before
;-----------------------------------;
move.l GWVA_FSLIDER_OBJ_PAGESIZE(a0),d0
sub.l #1,d0 ; taille page = taille slider - 1
bgt.s .page_de_plus_1_element
moveq #1,d0
.page_de_plus_1_element:
GWVA_CALL_METHOD_DIFF_METH_SAME_CLASS #GWVA_METHOD_FSLIDER_MOVE
;-----------------------------------;
; pas d'after
move.w #GWVA_PRGRET_CONSUMED,d6
rts
;------------------------------------------------------------------------------
; Method name : GWVA_METHOD_FSLIDER_MINUSPAGE
; Asm label : GWVA_FSLIDER_PRG_MINUSPAGE
; Description : Déplace le slider d'une page en moins
;
; Rq : Génère un FSLIDER_MOVE et eventuellement un MOVED.
; Rq : Pas de gestion de l'objet RSC de M1P.
;
; in : a0.l = pointeur sur l'objet
; in : a1.l = pointeur sur la fenêtre formulaire
; out : d6.w = GWVA_PRGRET_CONSUMED
;
; 01/05/98 : Création
;------------------------------------------------------------------------------
GWVA_FSLIDER_PRG_MINUSPAGE:
; pas de before
;-----------------------------------;
move.l GWVA_FSLIDER_OBJ_PAGESIZE(a0),d0
sub.l #1,d0 ; taille page = taille slider - 1
bgt.s .page_de_plus_1_element
moveq #1,d0
.page_de_plus_1_element:
neg.l d0
GWVA_CALL_METHOD_DIFF_METH_SAME_CLASS #GWVA_METHOD_FSLIDER_MOVE
;-----------------------------------;
; pas d'after
move.w #GWVA_PRGRET_CONSUMED,d6
rts
;------------------------------------------------------------------------------
; Method name : GWVA_METHOD_FSLIDER_SET_POSITION
; Asm label : GWVA_FSLIDER_PRG_SET_POSITION
; Description : Place le slider à une position donnée
;
; Rq : Génère un FSLIDER_MOVE et eventuellement un MOVED.
; Rq : La position sera corrigée si elle dépasse les limites possibles.
;
; in : a0.l = pointeur sur l'objet
; in : a1.l = pointeur sur la fenêtre formulaire
; in : d0.l = position voulue ( 0 <= x < LENGTH)
; out : d6.w = GWVA_PRGRET_CONSUMED
;
; 01/05/98 : Création
;------------------------------------------------------------------------------
GWVA_FSLIDER_PRG_SET_POSITION:
; pas de before
;-----------------------------------;
sub.l GWVA_FSLIDER_OBJ_POS(a0),d0
GWVA_CALL_METHOD_DIFF_METH_SAME_CLASS #GWVA_METHOD_FSLIDER_MOVE
;-----------------------------------;
; pas d'after
move.w #GWVA_PRGRET_CONSUMED,d6
rts
;------------------------------------------------------------------------------
; Method name : GWVA_METHOD_CREATE
; Asm label : GWVA_FSLIDER_PRG_CREATE
; Description : Création d'un objet slider
;
; Rq : On calcule la taille du coulisseau au démarage en fonction des valeurs
; Rq : des champs de la structure. Pas d'affichage
;
; in : a0.l = pointeur sur l'objet
; in : a1.l = pointeur sur la fenêtre
; in : a2.l = pointeur sur le tree du ressource
; out : d6.w = GWVA_PRGRET_CONSUMED
;
; 26/04/98 : Création
;------------------------------------------------------------------------------
GWVA_FSLIDER_PRG_CREATE:
GWVA_CHECK_OBJ_HANDLE
;-----------------------------------;
save.l a1-a2
move.l a2,a1
bsr GWVA_FSLIDER_UPDATE_POS_SIZE
load.l a1-a2
;-----------------------------------;
; envoyer la méthode GWVA_METHOD_CREATED
GWVA_EXEC_VISUAL_EVENT #GWVA_METHOD_CREATED
moveq #GWVA_PRGRET_CONSUMED,d6
moveq #GWVA_NO_ERROR_GENERIC,d7
rts
;------------------------------------------------------------------------------
; Method name : GWVA_METHOD_FORM_CLICK
; Asm label : GWVA_FSLIDER_PRG_CLICK
; Description : Méthode de traitement d'un clic dans un slider
;
; Rq : Pas de CLICKED, mais peut générer un GWVA_METHOD_FSLIDER_MOVE
;
; in : a0.l = pointeur sur l'objet
; in : a1.l = pointeur sur le buffer d'entrée typé GWVA_FORM_CLICK_IN
; in : d0.l = [ X.w | num gem.w ]
; in : d1.l = [ Y.w | mouse button.w ]
; in : d2.l = [ Key state.w | mouse count.w ]
; out : d6.w = GWVA_PRGRET_NOT_CONSUMED ou GWVA_PRGRET_CONSUMED
;
; 25/04/98 : Création
;------------------------------------------------------------------------------
GWVA_FSLIDER_PRG_CLICK:
GWVA_EXEC_VISUAL_EVENT #GWVA_METHOD_ON_FORM_CLICK
cmp.w #GWVA_SEARCH_EXEC_CONSUMED,d6
beq .pas_click_car_on_click_consomme
;-----------------------------------;
cmp.w GWVA_FSLIDER_OBJ_FATHER_IDX(a0),d0
bne.s .pas_deplacement_page
; Déplacement +1 page si la souris est à droite du fils.
; Déplacement +1 page si la souris est dessous du fils.
swap d0 ; x souris
swap d1 ; y souris
save.l a0-a1/d0-d1
move.w GWVA_FSLIDER_OBJ_SON_IDX(a0),d0
move.l GWVA_FORM_CLICK_IN_TREE_PTR(a1),a0
bsr GWVA_RSC_RETURN_OBJ_POS_SIZE
move.w d0,d2 ; d2.w : position x
move.w d1,d3 ; d3.w : position y
load.l a0-a1/d0-d1
bftst GWVA_FSLIDER_OBJ_PROPERTIES(a0){GWVA_FSLIDER_OLBIT_ORIENTATION:1}
beq.s .slider_horizontal1
move.w d1,d0
move.w d3,d2
.slider_horizontal1:
cmp.w d2,d0
blt.s .deplacement_m1_page
move.l GWVA_FORM_CLICK_IN_WIND_PTR(a1),a1
GWVA_CALL_METHOD_DIFF_METH_SAME_CLASS #GWVA_METHOD_FSLIDER_PLUSPAGE
bra .click_consomme
.deplacement_m1_page:
move.l GWVA_FORM_CLICK_IN_WIND_PTR(a1),a1
GWVA_CALL_METHOD_DIFF_METH_SAME_CLASS #GWVA_METHOD_FSLIDER_MINUSPAGE
bra .click_consomme
.pas_deplacement_page:
cmp.w GWVA_FSLIDER_OBJ_SON_IDX(a0),d0
bne.s .pas_deplacement_souris
save.l a0-a1
clr.w d0
bftst GWVA_FSLIDER_OBJ_PROPERTIES(a0){GWVA_FSLIDER_OLBIT_ORIENTATION:1}
beq.s .slider_horizontal
moveq #1,d0
.slider_horizontal:
graf_slidebox GWVA_FORM_CLICK_IN_TREE_PTR(a1),GWVA_FSLIDER_OBJ_FATHER_IDX(a0),GWVA_FSLIDER_OBJ_SON_IDX(a0),d0
load.l a0-a1
move.l GWVA_FSLIDER_OBJ_LENGTH(a0),d4
sub.l GWVA_FSLIDER_OBJ_PAGESIZE(a0),d4 ; d4.l : déplacement maximal dans le père en élément
bpl.s .positif
moveq #0,d4
.positif:
ext.l d0 ; d0.l : position désirée (0-1000)
moveq #0,d5
moveq #0,d6
mulu.l d0,d5:d4
add.l #1000-1,d4
addx.l d6,d5 ; on arrondi au millier supérieur
divu.l #1000,d5:d4 ; d4.l : nouvelle position du coulisseau en élément
move.l d4,d0
move.l GWVA_FORM_CLICK_IN_WIND_PTR(a1),a1
GWVA_CALL_METHOD_DIFF_METH_SAME_CLASS #GWVA_METHOD_FSLIDER_SET_POSITION
bra .click_consomme
.pas_deplacement_souris:
tst.w GWVA_FSLIDER_OBJ_P1_IDX(a0)
beq.s .pas_p1_idx
cmp.w GWVA_FSLIDER_OBJ_P1_IDX(a0),d0
bne.s .pas_deplacement_p1
bsr GWVA_FSLIDER_PROCESS_MOTION_BUTTON
move.l GWVA_FORM_CLICK_IN_WIND_PTR(a1),a1
GWVA_CALL_METHOD_DIFF_METH_SAME_CLASS #GWVA_METHOD_FSLIDER_PLUS1
bra .click_consomme
.pas_p1_idx:
.pas_deplacement_p1:
tst.w GWVA_FSLIDER_OBJ_M1_IDX(a0)
beq.s .pas_m1_idx
cmp.w GWVA_FSLIDER_OBJ_M1_IDX(a0),d0
bne.s .pas_deplacement_m1
bsr GWVA_FSLIDER_PROCESS_MOTION_BUTTON
move.l GWVA_FORM_CLICK_IN_WIND_PTR(a1),a1
GWVA_CALL_METHOD_DIFF_METH_SAME_CLASS #GWVA_METHOD_FSLIDER_MINUS1
bra .click_consomme
.pas_m1_idx:
.pas_deplacement_m1:
tst.w GWVA_FSLIDER_OBJ_P1P_IDX(a0)
beq.s .pas_p1p_idx
cmp.w GWVA_FSLIDER_OBJ_P1P_IDX(a0),d0
bne.s .pas_deplacement_p1_page2
bsr GWVA_FSLIDER_PROCESS_MOTION_BUTTON
move.l GWVA_FORM_CLICK_IN_WIND_PTR(a1),a1
GWVA_CALL_METHOD_DIFF_METH_SAME_CLASS #GWVA_METHOD_FSLIDER_PLUSPAGE
bra .click_consomme
.pas_p1p_idx:
.pas_deplacement_p1_page2:
tst.w GWVA_FSLIDER_OBJ_M1P_IDX(a0)
beq.s .pas_m1p_idx
cmp.w GWVA_FSLIDER_OBJ_M1P_IDX(a0),d0
bne.s .pas_deplacement_m1_page2
bsr GWVA_FSLIDER_PROCESS_MOTION_BUTTON
move.l GWVA_FORM_CLICK_IN_WIND_PTR(a1),a1
GWVA_CALL_METHOD_DIFF_METH_SAME_CLASS #GWVA_METHOD_FSLIDER_MINUSPAGE
bra .click_consomme
.pas_m1p_idx:
.pas_deplacement_m1_page2:
; pas concerne par ce message
moveq #GWVA_PRGRET_NOT_CONSUMED,d6
rts
.click_consomme:
.pas_click_car_on_click_consomme:
moveq #GWVA_PRGRET_CONSUMED,d6
rts
;------------------------------------------------------------------------------
; Method name : GWVA_METHOD_FSLIDER_MOVE
; Asm label : GWVA_FSLIDER_PRG_MOVE
; Description : Méthode de gestion du mouvement du slider
;
; Rq : MOVED si le slider a bougé. Pas les même paramètres en entrée.
;
; in : a0.l = pointeur sur l'objet
; in : a1.l = pointeur sur la fenêtre formulaire
; in : d0.l = déplacement du slider en nombre d'élément
; out : d6.w = GWVA_PRGRET_CONSUMED
;
; 26/04/98 : Création
;------------------------------------------------------------------------------
GWVA_FSLIDER_PRG_MOVE:
GWVA_EXEC_VISUAL_EVENT #GWVA_METHOD_ON_FSLIDER_MOVE
cmp.w #GWVA_SEARCH_EXEC_CONSUMED,d6
beq .pas_move_car_on_move_consomme
;-----------------------------------;
move.l GWVA_WRSC_OBJ_TREE_PTR(a1),a2 ; a2.l : pointeur sur le tree
move.l GWVA_FSLIDER_OBJ_LENGTH(a0),d4
sub.l GWVA_FSLIDER_OBJ_PAGESIZE(a0),d4
bpl.s .positif1
moveq #0,d4
.positif1: ; d4.l : position maximale du slider
move.l GWVA_FSLIDER_OBJ_POS(a0),d5
add.l d0,d5
bge.s .position_positive
moveq #0,d5
.position_positive:
cmp.l d5,d4
bge.s .position_possible
; move.l GWVA_FSLIDER_OBJ_POS(a0),d5
move.l d4,d5
.position_possible: ; d5.l : position voulue
move.l d5,d3
sub.l GWVA_FSLIDER_OBJ_POS(a0),d3 ; d3.l = 0 : pas de déplacement physique
move.l d5,GWVA_FSLIDER_OBJ_POS(a0) ; d5.l : position actuelle du slider
save.l d3/d5/a1
move.l a2,a1
bsr GWVA_FSLIDER_UPDATE_POS_SIZE
load.l d3/d5/a1
tst.w d0
beq.s .pas_changement_graphique_slider
save.l d3/d5/a0-a2
lea GWVA_FSLIDER_TMP_OBJ_REDRAW_LIST,a2
move.w GWVA_FSLIDER_OBJ_FATHER_IDX(a0),(a2)
move.w #7,2(a2) ; on veut redrawer tout l'arbre
move.w #GWVA_WRSC_CTE_REDRAW_PART_END_LIST,4(a2)
move.l a1,a0
move.l a2,a1
GWVA_CALL_METHOD_OTHER_OBJ #GWVA_METHOD_WRSC_REDRAW_PART_CONTENTS
load.l d3/d5/a0-a2
.pas_changement_graphique_slider:
move.l GWVA_FSLIDER_OBJ_POS(a0),d7 ; nouvelle position corrigée
sub.l d5,d7 ; déplacement par rapport à la position non corrigée
add.l d7,d3 ; d3.l : déplacement effectif du slider (physique + correction graphique)
tst.l d3
beq.s .pas_deplacement_slider
move.l GWVA_FSLIDER_OBJ_POS(a0),d0 ; position
move.l d3,d1 ; déplacement
; a1.l pointeur sur la fenêtre
GWVA_EXEC_VISUAL_EVENT #GWVA_METHOD_FSLIDER_MOVED
.pas_deplacement_slider:
.pas_move_car_on_move_consomme:
moveq #GWVA_PRGRET_CONSUMED,d6
rts
;------------------------------------------------------------------------------
; Method name :
; Asm label : GWVA_FSLIDER_PROCESS_MOTION_BUTTON
; Description : Traitement du click sur les boutons du slider
;
; Rq : Préserve a1-a2.l
;
; in : a0.l = pointeur sur l'objet
; in : a1.l = pointeur sur le buffer d'entrée typé GWVA_FORM_CLICK_IN
; in : d0.l = [ X.w | num gem.w ]
; in : d1.l = [ Y.w | mouse button.w ]
; in : d2.l = [ Key state.w | mouse count.w ]
;
; 01/05/98 : Création
;------------------------------------------------------------------------------
GWVA_FSLIDER_PROCESS_MOTION_BUTTON:
save.l a1-a2
lea GWVA_FSLIDER_TMP_IN_BUF,a3
move.l GWVA_FORM_CLICK_IN_WIND_PTR(a1),GWVA_FORM_BUTTON_IN_WIND_PTR(a3)
move.l GWVA_FORM_CLICK_IN_TREE_PTR(a1),GWVA_FORM_BUTTON_IN_TREE_PTR(a3)
move.l a3,a1
lea GWVA_FSLIDER_TMP_OUT_BUF,a2
; + d0-d2 passés en entrée
GWVA_CALL_METHOD_DIFF_METH_SAME_CLASS #GWVA_METHOD_FORM_BUTTON
load.l a1-a2
rts
;------------------------------------------------------------------------------
; Method name :
; Asm label : GWVA_FSLIDER_UPDATE_POS_SIZE
; Description : Mise à jour de la position et de la taille graphique du slider
;
; Rq : La position structurelle du slider (POS) peut avoir changé après cette
; Rq : fonction.
; Rq : Pas d'affichage par cette routine.
; Rq : a0-a1.l non modifiés
;
; in : a0.l = pointeur sur l'objet
; in : a1.l = pointeur sur le tree du ressource
; out : d0.w = 0 pas de changement graphique à faire, <> 0 réaffichage à faire
;
; 26/04/98 : Création
;------------------------------------------------------------------------------
GWVA_FSLIDER_UPDATE_POS_SIZE:
move.w GWVA_FSLIDER_OBJ_SON_IDX(a0),d2
mulu #L_OBJECT,d2
lea (a1,d2.l),a4 ; pointeur sur l'objet RSC fils = coulisseau
move.w GWVA_FSLIDER_OBJ_FATHER_IDX(a0),d2
mulu #L_OBJECT,d2
lea (a1,d2.l),a5 ; pointeur sur l'objet RSC père = glissière
move.w #ob_x,d2
move.w #ob_width,d3
bftst GWVA_FSLIDER_OBJ_PROPERTIES(a0){GWVA_FSLIDER_OLBIT_ORIENTATION:1}
beq.s .slider_horizontal
move.w #ob_y,d2
move.w #ob_height,d3
.slider_horizontal:
move.l GWVA_FSLIDER_OBJ_LENGTH(a0),d5 ; taille structurelle de la glisière
move.w (a5,d3.w),d4 ; taille graphique de la glissière
ext.l d4
mulu.l GWVA_FSLIDER_OBJ_PAGESIZE(a0),d6:d4
divu.l d5,d6:d4 ; d4.w : taille page / taille glissière * taille graphique glissière = taille graphique coulisseau
move.w d4,d0
sub.w (a4,d3.w),d0 ; d0.w = 0 : pas de changement de taille graphique du coulisseau
move.w d4,(a4,d3.w) ; nouvelle taille graphique du coulisseau
move.w (a5,d3.w),d4 ; taille père
sub.w (a4,d3.w),d4 ;- taille fils = d4.w : deplacement graphique possible du fils dans le père
ble .pas_de_place_pour_deplacement
move.l GWVA_FSLIDER_OBJ_LENGTH(a0),d5
sub.l GWVA_FSLIDER_OBJ_PAGESIZE(a0),d5 ; d5.l : déplacement structurelle possible du fils dans le père
ble .pas_de_place_pour_deplacement
ext.l d4
mulu.l GWVA_FSLIDER_OBJ_POS(a0),d6:d4
divu.l d5,d6:d4 ; d4.w : nouvelle position grphique du coulisseau dans la glissière
move.w d4,d3
sub.w (a4,d2.w),d3 ; d3.w = 0 : pas de déplacement graphique du coulisseau
move.w d4,(a4,d2.w) ; nouvelle position graphique du fils
or.w d3,d0
.update_affichage_slider:
rts
.pas_de_place_pour_deplacement:
move.w d4,d0
* move.w (a5,d3.w),d0
* sub.w (a4,d3.w),d0
move.w (a5,d3.w),(a4,d3.w) ; taille fils = taille père
clr.w (a4,d2.w) ; pos fils = 0
clr.l GWVA_FSLIDER_OBJ_POS(a0) ; on corrige la position structurelle
bra .update_affichage_slider
;------------------------------------------------------------------------------
BSS
GWVA_FSLIDER_TMP_IN_BUF: ds.b GWVA_FORM_BUTTON_IN_STRUCT_LENGTH
GWVA_FSLIDER_TMP_OUT_BUF: ds.b GWVA_FORM_BUTTON_OUT_STRUCT_LENGTH
GWVA_FSLIDER_TMP_OBJ_REDRAW_LIST: ds.w 2+1
TEXT
;------------------------------------------------------------------------------